<?php
/**
 * Description of Util
 *
 * @author inti, aUbilla
 */
class Util {

    const ZONA_HORARIA = "America/Santiago";
    const MENSAJE_ERROR = 0;
    const MENSAJE_ALERTA = 1;
    const MENSAJE_INFO = 2;
    const MENSAJE_WARNING = 3;
    const MENSAJE_OK = 4;
    const MOSTRAR_MENSAJE_USUARIO = "mostrarMensajeUsuario";
    const LLAVE_PRINCIPAL = "_[Iasd31Nkjas9ToowfIeaea]_";

    public static function isNullOrEmpty($valor) {
        $esNulo = false;
        try {
            if (empty($valor) || is_null($valor)) {
                $esNulo = true;
            }
        } catch (Exception $e) {
            $esNulo = false;
        }
        return $esNulo;
    }

    public static function isNull($valorActual, $valorReemplazo) {
        if (self::isNullOrEmpty($valorActual)) {
            return $valorReemplazo;
        } else {
            return $valorActual;
        }
    }

    public static function newCaptcha() {
        $numero1 = rand(5, 9);
        $numero2 = rand(1, 5);
        $numero3 = rand(1, 9);
        $resultado = ($numero1 - $numero2) * $numero3;
        $cadena = "($numero1 - $numero2) * $numero3";
        self::setSession("captcha", self::encriptar($resultado, self::LLAVE_PRINCIPAL));
        return $cadena;
    }

    public static function getCaptcha() {
        return self::desencriptar(self::getSession("captcha"), self::LLAVE_PRINCIPAL);
    }

    public static function getSession($nombreSesion) {
        $session = new THttpSession();
        try {
            $session->open();
        } catch (Exception $e) {
            
        }

        $obj = null;
        try {
            $obj = $session[self::LLAVE_PRINCIPAL . $nombreSesion];
        } catch (Exception $e) {
            $obj = null;
        }
        return $obj;
    }

    public static function setSession($nombreSesion, $obj) {
        $session = new THttpSession();
        try {
            $session->open();
        } catch (Exception $e) {
            
        }

        try {
            $session[self::LLAVE_PRINCIPAL . $nombreSesion] = $obj;
        } catch (Exception $e) {
            $session[self::LLAVE_PRINCIPAL . $nombreSesion] = null;
        }
    }

    public static function logFile($tipoMensaje, $mensaje) {
        date_default_timezone_set(self::ZONA_HORARIA);
        $fechaHora = date("d/m/Y H:i:s");
        $archivo = fopen("log.txt", "a+");
        $tm = "";
        switch ($tipoMensaje) {
            case self::MENSAJE_ALERTA:
                $tm = "ALERTA ";
                break;
            case self::MENSAJE_ERROR:
                $tm = "ERROR ";
                break;
            case self::MENSAJE_INFO:
                $tm = "INFO ";
                break;
            case self::MENSAJE_OK:
                $tm = "OK ";
                break;;
        }

        fwrite($archivo, $tm . ": " . $fechaHora . ". MENSAJE: " . $mensaje . "\n");
        fclose($archivo);
    }

    public static function formateaErrorValidacion($mensaje) {
        $retorno = "Se encontraron los siguientes errores: " . $mensaje;
        return $retorno;
    }

    public static function encriptar($string, $key) {
        $result = '';
        for ($i = 0; $i < strlen($string); $i++) {
            $char = substr($string, $i, 1);
            $keychar = substr($key, ($i % strlen($key)) - 1, 1);
            $char = chr(ord($char) + ord($keychar));
            $result.=$char;
        }
        return base64_encode($result);
    }

    public static function desencriptar($string, $key) {
        $result = '';
        $string = base64_decode($string);
        for ($i = 0; $i < strlen($string); $i++) {
            $char = substr($string, $i, 1);
            $keychar = substr($key, ($i % strlen($key)) - 1, 1);
            $char = chr(ord($char) - ord($keychar));
            $result.=$char;
        }
        return $result;
    }

    public static function encriptarUrl($arr) {
        return base64_encode(json_encode($arr));
    }

    public static function desencriptarUrl($argumento, $key = null) {
        $arr = json_decode(base64_decode($argumento));
        if (is_null($key))
            return $arr;
        try {
            return $arr->$key;
        } catch (Exception $e) {
            return null;
        }
    }

    public static function mostrarMsj($page, $msj, $tipoMsj) {
        $msj = self::escaparComillasJS($msj);
        $page->ClientScript->registerEndScript("cargarMsj", "cargarMsj('" . $page->Theme->BaseUrl . "','" . $msj . "','" . $tipoMsj . "');");
    }

    public static function escaparComillasJS($texto) {
        //cambio los \n por ~~ (esto es necesario, pues a continuacion voy a sacar los "\" para que no puedan dañar)
        $texto = str_replace("\n", "~~", $texto);
        //escapa el caracter de escape
        $texto = str_replace("\\", "\\\\", $texto);
        //escapa comillas simples
        $texto = str_replace("'", "\'", $texto);
        //escapa comillas dobles
        $texto = str_replace("\"", "\042", $texto);
        //cambia ~~ por \n
        $texto = str_replace("~~", "\n", $texto);

        return trim($texto);
    }

    public static function getQuery($arr, $query) {
        foreach ($arr as $key => $value) {
            $query = str_replace($key, $value, $query);
        }
        return $query;
    }   

    public static function getFechaHoraActual() {
        return date("d/m/Y H:i:s");
    }

    public static function getIp() {
        return $_SERVER['REMOTE_ADDR'];
    }

    public static function fechaDateTimeANormal($fecha, $mostrarHHMM = false) {
        date_default_timezone_set(self::ZONA_HORARIA);
        $nuevaFecha = "";
        if (!empty($fecha)) {
            $fecha = strtotime($fecha);
            if ($mostrarHHMM) {
                $nuevaFecha = date("d/m/Y H:i", $fecha);
            } else {
                $nuevaFecha = date("d/m/Y", $fecha);
            }
        }
        return $nuevaFecha;
    }

    public static function fechaNormalADateTime($fecha) {
        date_default_timezone_set(self::ZONA_HORARIA);
        $nuevaFecha = "";
        if (!empty($fecha)) {
            $fecha = str_replace('/', '-', $fecha);
            $fecha = strtotime($fecha);
            $nuevaFecha = date("Y-m-d H:i", $fecha);
        }
        return $nuevaFecha;
    }

    public static function setMensajeUsuario($mensaje, $tipoMensaje) {
        $mensajeRetorno = "";
        switch ($tipoMensaje) {
            case self::MENSAJE_ERROR:
                $mensajeRetorno = "<div ID='holderMensaje' class='alert alert-error' style='display: block;'>
                <button type='button' class='close'>&times;</button>
                <h4>Error</h4>
                " . $mensaje . "
                </div>";
                break;
            
            case self::MENSAJE_OK:
                $mensajeRetorno = "<div ID='holderMensaje' class='alert alert-success' style='display: block;'>
                <button type='button' class='close'>&times;</button>
                <h4>Ok!</h4>
                " . $mensaje . "
                </div>";
                break;
            
            case self::MENSAJE_ALERTA:
                $mensajeRetorno = "<div ID='holderMensaje' class='alert alert-block' style='display: block;'>
                <button type='button' class='close'>&times;</button>
                <h4>Alerta!</h4>
                " . $mensaje . "
                </div>";
                break;
            case self::MENSAJE_INFO:
                $mensajeRetorno = "<div ID='holderMensaje' class='alert alert-info' style='display: block;'>
                <button type='button' class='close'>&times;</button>
                <h4>Atenci&oacute;n!</h4>
                " . $mensaje . "
                </div>";
                break;
        }        
        return $mensajeRetorno;
    }
    
    public static function calcularEdadDecimal($fechaNacimiento){
        $fechaNacimiento = Util::fechaDateTimeANormal($fechaNacimiento);
        $fechaNacimiento = str_replace("/", "", $fechaNacimiento);
        $fechaActual = date("dmY");                
        $fechaNac = "";
        $fechaAct = "";
        preg_match("/([0-9]{1,2})([0-9]{1,2})([0-9]{2,4})/", $fechaNacimiento, $fechaNac);
        preg_match("/([0-9]{1,2})([0-9]{1,2})([0-9]{2,4})/", $fechaActual, $fechaAct);                
        $dateNacimiento = mktime(0,0,0,$fechaNac[2], $fechaNac[1], $fechaNac[3]);
        $dateActual = mktime(0,0,0,$fechaAct[2], $fechaAct[1], $fechaAct[3]);
        $edadDecimal = number_format((($dateActual - $dateNacimiento) / (60 * 60 * 24 * 365)),1);
        return $edadDecimal;
    }
    
    public static function obtenerMensajeCorreoRequerimiento($oRequerimiento, $observacion = '', $link = '') {
        $template="";
        $templateHTML = "<html><head><style type='text/css'>
            body {
                padding: 0;
		margin: 0;
		font: 13px Arial, Helvetica, sans-serif;
		text-align: justify;
            }
            </style></head><body lang=ES-CL>{#CONTENIDO_MAIL}</body></html>";
        switch ($oRequerimiento->getIdEstado()) {
            case EstadoRequerimiento::DESARROLLO:
                $template = "Estimado(a) {#USUARIO}<br /><br />";
                $template .= "Su requerimiento esta siendo desarrollado. Le comunicaremos oportunamente para que pueda validarlo OK, gracias.<br /><br />";
                $template .= "Fecha Estimada: {#FECHA_ENTREGA}<br />";
                $template .= "Atendido por: {#REALIZADO_POR}<br /><br />";
                $template .= "A medida que su requerimiento sea procesado se le notificar&aacute; por este medio sobre el estado.<br /><br />";
                $template .= "Este correo fue enviado en forma autom&aacute;tica por el Sistema de Requerimientos ALTO el {#NOW} hrs.";

                $template = str_replace("{#USUARIO}", $oRequerimiento->getQuienSolicita(), $template);
                $template = str_replace("{#FECHA_ENTREGA}", $oRequerimiento->getFechaEntrega(), $template);
                $template = str_replace("{#REALIZADO_POR}", $oRequerimiento->getRealizadoPor(), $template);
                break;

            case EstadoRequerimiento::CERRADO_POR_VALIDAR:
                $template = "Estimado(a) {#USUARIO}<BR /><br />";
                $template .= "Su requerimiento ha sido terminado con el siguiente comentario.<BR /><BR />";
                $template .= "{#OBSERVACION}<BR /><BR />";
                $template .= "Le solicitamos que revise el siguiente link para indicar si esta solucionado o no su requerimiento.<BR /><br />";
                $template .= "{#LINK} <BR /><BR />";
                $template .= "Requerimiento atendido por: {#REALIZADO_POR}<BR /><BR />";
                $template .= "A medida que su requerimiento sea procesado se le notificar&aacute; por este medio sobre el estado.<br />";
                $template .= "Este correo fue enviado en forma autom&aacute;tica por el Sistema de Requerimientos ALTO el {#NOW} hrs. ";

                $template = str_replace("{#USUARIO}", $oRequerimiento->getQuienSolicita(), $template);
                $template = str_replace("{#OBSERVACION}", $observacion, $template);
                $template = str_replace("{#LINK}", $link, $template);
                $template = str_replace("{#REALIZADO_POR}", $oRequerimiento->getRealizadoPor(), $template);
                break;

            case EstadoRequerimiento::CERRADO_NO_SATISFACTORIAMENTE:
                $template = "Cliente ha indicado que su requerimiento ID:{#ID}, ASUNTO:{#ASUNTO} no se encuentra solucionado.<br /><br />";
                $template .= "Motivo: {#OBSERVACION}<br /><br />";
                $template .= "Este correo fue enviado en forma autom&aacute;tica por el Sistema de Requerimientos ALTO el {#NOW} hrs. ";

                $template = str_replace("{#ID}", $oRequerimiento->getId(), $template);
                $template = str_replace("{#ASUNTO}", $oRequerimiento->getNombre(), $template);
                $template = str_replace("{#OBSERVACION}", $observacion, $template);
                break;
            
            case EstadoRequerimiento::CERRADO_SATISFACTORIAMENTE:
                $template = "Requerimiento {#ASUNTO}({#ID}) ha sido cerrado satisfactoriamente por cliente.<br /><br />";
                $template .= "Observaci&oacute;n: {#OBSERVACION}<br /><br />";
                $template .= "Este correo fue enviado en forma autom&aacute;tica por el Sistema de Requerimientos ALTO el {#NOW} hrs. ";

                $template = str_replace("{#ID}", $oRequerimiento->getId(), $template);
                $template = str_replace("{#ASUNTO}", $oRequerimiento->getNombre(), $template);
                $template = str_replace("{#OBSERVACION}", $observacion, $template);
                break;

            case EstadoRequerimiento::ELIMINADO:
                $template = "Requerimiento ID:{#ID}, ASUNTO:{#ASUNTO} fue eliminado<br /><br />";
                $template .= "Motivo: {#OBSERVACION}<br /><br />";
                $template .= "Este correo fue enviado en forma autom&aacute;tica por el Sistema de Requerimientos ALTO el {#NOW} hrs. ";

                $oRequerimiento = new Requerimiento();

                $template = str_replace("{#ID}", $oRequerimiento->getId(), $template);
                $template = str_replace("{#ASUNTO}", $oRequerimiento->getNombre(), $template);
                $template = str_replace("{#OBSERVACION}", $observacion, $template);
                break;

            default:
                break;
        }
        $template = str_replace("{#NOW}", Util::fechaHoraSQL(), $template);
        $templateHTML = str_replace("{#CONTENIDO_MAIL}", $template, $templateHTML);
        return $templateHTML;
    }

    public static function enviarEmail($id) {
        try {
            $link = "http://192.168.0.43:81/sra/web/index.php?page=Requerimiento.ValidaCliente&id={#ID}";
            $oRequerimientoBLL = new RequerimientoBLL();
            $oRequerimiento = new Requerimiento();
            $oRequerimiento = $oRequerimientoBLL->obtenerPorId($id);

            $mensaje = "";
            $observacion = "";
            $oNota = new Nota();
            $oNotaBLL = new NotaBLL();
            $oNota = $oNotaBLL->obtenerUltimoComentarioPorValidar($id);
            $observacion = $oNota->getNombre();
            $templateAsunto = "{#ASUNTO} ({#ID}) - {#ESTADO}";

            $templateAsunto = str_replace("{#ASUNTO}", $oRequerimiento->getNombre(), $templateAsunto);
            $templateAsunto = str_replace("{#ID}", $oRequerimiento->getId(), $templateAsunto);
            $templateAsunto = str_replace("{#ESTADO}", $oRequerimiento->getEstado(), $templateAsunto);

            if ($oRequerimiento->getIdEstado() == EstadoRequerimiento::CERRADO_POR_VALIDAR) {
                $link = str_replace("{#ID}", $oRequerimiento->getId(), $link);
            }
            $mensaje = self::obtenerMensajeCorreoRequerimiento($oRequerimiento, $observacion, $link);

            $mail = new PHPMailer();
            $mail->AddAddress($oRequerimiento->getCorreoQuienSolicita());
            self::obtenerDestinatarioCC($mail, $oRequerimiento);
            //$mail->AddCC("soporte...");

            $mail->Mailer = "smtp";
            $mail->Host = "mta.gtdinternet.com";
            $mail->SMTPAuth = true;
            $mail->Username = "sra@alto.cl";
            $mail->Password = "Jhd7Hs";
            $mail->From = "sra@alto.cl";
            $mail->FromName = "SRA - Sistema Requerimientos Alto";
            $mail->Timeout = 30;
            $mail->Subject = $templateAsunto;
            $mail->Body = $mensaje;
            $mail->IsHTML(true);

            $exito = $mail->Send();
            $intentos = 1;
            while ((!$exito) && ($intentos <= 2)) {
                sleep(2);
                $exito = $mail->Send();
                $intentos = $intentos + 1;
            }
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    public static function obtenerDestinatarioCC(&$mail, $oRequerimiento) {
        if ($oRequerimiento->getCorreoCC() != "") {
            if (strpos($oRequerimiento->getCorreoCC(), ';') > 0) {
                $arrCC = explode(";", $oRequerimiento->getCorreoCC());
                foreach ($arrCC as $casilla) {
                    if ($casilla != null && $casilla != '') {
                        $mail->AddCC($casilla);
                    }
                }
            } else {
                $mail->AddCC($oRequerimiento->getCorreoCC());
            }
        }
    }
}

?>
